#获取人脸特征点的数据
#将人脸表情划分完成之后，将数据写入到数据集的labels文件夹下的txt文档中
#每张图片对应一个labels文件夹下的txt文档
#txt文档说明：以图像的左上角为(0,0)点计算x_center y_center width height的值
#class x_center y_center width height
#第一列是class名，比如微笑是0，则class改为0，剩余四项是 x_center y_center width height
#YOLO 是目标检测，如果我个人理解没有错误的话，那么分类成几个类别，一样会检测出来是否是微笑等
#此处能得到人脸图像的方框数值

import cv2
import dlib
import os
import sys

output_dir = "labels"
origin_dir = "face_images"
if not os.path.exists(output_dir):
    os.makedirs(output_dir)

# 使用训练好的68个特征点模型
predictor_path = "shape_predictor_68_face_landmarks.dat"
predictor = dlib.shape_predictor(predictor_path)

# 正向人脸检测器将图像
detector = dlib.get_frontal_face_detector()

for filenames in os.listdir(origin_dir):
    # 读取图片
    img = cv2.imread(origin_dir + '/' +filenames)
    # 转换为灰阶图片
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 使用检测器来检测图像中的人脸
    faces = detector(gray, 1)
    # 打印结果
    #print("人脸数: ", len(faces))
    if (len(faces))!=0:
        for i, face in enumerate(faces):
            #print("第", i+1, "个人脸的矩形框坐标：\n","left:", face.left(), "right:", face.right(), "top:", face.top(), "bottom:", face.bottom())
            # 获取人脸特征点
            shape = predictor(img, face)
            #print("第", i+1, '个人脸特征点:')
            #print(shape.parts())
            w = img.shape[1]
            h = img.shape[0]

            x_center = 0.5*(face.right() - face.left())/w
            y_center = 0.5*(face.bottom() - face.top())/h
            width = float((face.right() - face.left())/w)
            height = float((face.bottom() - face.top())/h)
            txt_f = open(output_dir +  '/' + filenames,"w")
            sys.stdout = txt_f
            print(0,x_center,y_center,width,height)
    else:
        os.remove(origin_dir + '/' +filenames)